/**
 * FormControl
 * 
 * form -> form da controllare
 * config -> oggetto di configurazione
 * ajax -> flag
 * 
 * esempio:
 * config -> nome_campo -> regex
 * 						-> message
 * 
 * @class FormControl
 * @param form
 * @param config
 * @param ajax
 * @returns
 */
function FormControl(form,config,ajax){
	/**
	 * @field
	 */
	var that = this;
	/**
	 * @field
	 */
	var form = $(form);
	/**
	 * Oggetto
	 * 
	 * Sintassi: [nome_campo] => true (se c'e' un errore)
	 * 
	 * @field
	 */
	var ErrorVal = {};
	/**
	 * Oggetto
	 * 
	 * Sintassi: [nome_campo] => /regex/
	 * 
	 * @field
	 */
	var validationRules ={};
	/**
	 * Oggetto
	 * 
	 * Sintassi: [nome_campo] => "Messaggio errore"
	 * @field
	 */
	var ErrorValMessages = {};
	/**
	 * @field
	 */
	var ajax = ajax;
	/**
	 * Aggiunge eventi ai campi input
	 */
	this.addValidation = function() {
		
		var input = form.find('input[name],textarea[name]');
		
		input.each(function(){
			//Se non e' in lista saltalo
			var trovato = false;
			for(var i in validationRules){
				if(i == $(this).attr('name')){
					trovato = true;
					break;
				}
			}
			
			//Non in lista lo salto!
			if(!trovato){
				return;
			}
			
			$(this).change(function(){
				
				var campo_risposta = $(this).parent().find('.risposta');
				var value = $(this).val();
				var name = $(this).attr('name');
				
				var result = value.match(validationRules[name]);
				
				if(result == null || result.length != 1){
					
					if(campo_risposta.hasClass('ok')){
						campo_risposta.removeClass('ok');
					}
					
					campo_risposta.html(ErrorValMessages[name]).addClass('errore');
					
					ErrorVal[name] = true;
					
				}else{
					
					if(campo_risposta.hasClass('errore')){
						campo_risposta.removeClass('errore');
					}
					
					campo_risposta.html('Campo corretto!');
					campo_risposta.addClass('ok');
					
					ErrorVal[name] = false;
				}
			});
		});
		
		if(window.console && window.debug){
			window.console.info('Validazioni aggiunte correttamente!');
		}
		
	}
	/**
	 * Controlla il submit
	 */
	this.addSubmit = function(){
		
		
		form.submit(function(e){
			
			for(var i in ErrorVal){
				form.find('input[name='+i+'],textarea[name='+i+']').trigger('change');
			}
			
			for(var i in ErrorVal){
				
				if(ErrorVal[i] == true){
					window.messaggioPopup.display('Errore','Alcuni dei campi non sono validi!');
					return false;
				}
			}
			
			if(ajax == true){
				
				var url = form.attr('action');
					
				var dati = {};
				
				if(window.console && window.debug){
					window.console.info('Analizzando il form ...');
				}
				
				form.find('input[name]').each(function(){
					
					var name = $(this).attr('name');
					var value = $(this).val();
					dati[name] = value;
					
				});
				
				form.find('textarea[name]').each(function(){
					
					var name = $(this).attr('name');
					var value = $(this).val();
					dati[name] = value;
					
				});
				
				window.ajax.doAjax(url,dati);
				e.preventDefault();
			}
				
			return true;
		});
	}
	
	//Popolo i campi
	for(var i in config){
		validationRules[i] = config[i].regex;
		ErrorVal[i] = true;
		ErrorValMessages[i] = config[i].message;
	}
	
	this.addValidation();
	this.addSubmit();
	
}